<!DOCTYPE html>
<html class="x-admin-sm">

<head>
    <meta charset="UTF-8">
    <title>宿舍管理系统</title>
    <meta name="renderer" content="webkit">
    <meta name="csrf-token" content="{{ csrf_token() }}" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
        content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
    <link rel="stylesheet" href="{{ asset('css/font.css') }}">
    <link rel="stylesheet" href="{{ asset('css/xadmin.css') }}">
    <script src="{{ asset('lib/layui/layui.js') }}" charset="utf-8"></script>
    <script type="text/javascript" src="{{ asset('js/xadmin.js') }}"></script>
    <!--[if lt IE 9]>
    <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
    <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
    <style>
        .custom-loading {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            padding: 20px;
        }

        .spinner {
            width: 100px;
            height: 100px;
            border: 4px solid #f3f3f3;
            border-top: 4px solid #3498db;
            border-radius: 50%;
            animation: spin 1s linear infinite;
            margin-bottom: 15px;
        }

        @keyframes spin {
            0% {
                transform: rotate(0deg);
            }

            100% {
                transform: rotate(360deg);
            }
        }

        .custom-loading-layer {
            border-radius: 8px !important;
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
        }
    </style>
</head>

<body>
    <div class="x-nav">
        <span class="layui-breadcrumb">
            <a href="/home">首页</a>
            <a>
                <cite>周期列表</cite></a>
        </span>
        <a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right"
            onclick="location.reload()" title="刷新">
            <i class="layui-icon layui-icon-refresh" style="line-height:30px"></i></a>
    </div>
    <div class="layui-fluid">
        <div class="layui-row layui-col-space15">
            <div class="layui-col-md12">
                <div class="layui-card">
                    <div class="layui-card-body ">
                        <form class="layui-form layui-col-space5">
                            <div class="layui-inline layui-show-xs-block">
                                <input class="layui-input" autocomplete="off" placeholder="开始日" name="start"
                                    id="start" value="{{ old('start') }}">
                            </div>
                            <div class="layui-inline layui-show-xs-block">
                                <input class="layui-input" autocomplete="off" placeholder="截止日" name="end"
                                    id="end" value="{{ old('end') }}">
                            </div>
                            <div class="layui-inline layui-show-xs-block">
                                <button class="layui-btn" lay-submit="" lay-filter="search"><i
                                        class="layui-icon">&#xe615;</i></button>
                            </div>
                        </form>
                    </div>
                    <div class="layui-card-body layui-table-body layui-table-main">
                        <table class="layui-hide" id="test" lay-filter="test"></table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
<script type="text/html" id="barDemo">
    {{--<a class="layui-btn layui-btn-xs" lay-event="not_rec">未抄</a>--}}
    @{{#  if(d.status == 0 || d.has_fee == false){ }}
    <a class="layui-btn layui-btn-xs" lay-event="calc">计算费用</a>
    @{{#  } }}

    @{{#  if(d.status == 100){ }}
    <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="unlock">解除锁定</a>
    @{{#  } }}

    @{{#  if(d.status == 1 && d.has_fee == true){ }}
    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="re_calc">重算</a>
    <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="verify">审核</a>
    @{{#  } }}

    @{{#  if(d.status == 2 && d.has_fee == true){ }}
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="un_verify">弃审</a>
    @{{#  } }}
</script>
<script>
    layui.use(['table', 'laydate', 'form'], function() {
        var laydate = layui.laydate;
        //执行一个laydate实例
        laydate.render({
            elem: '#start' //指定元素
        });

        //执行一个laydate实例
        laydate.render({
            elem: '#end' //指定元素
        });
        let b = build_criteria();
        let q = asm_query(b)
        let total = 0;
        var table = layui.table;
        table.render({
            elem: '#test',
            url: `/periods?${q}`,
            toolbar: 'default',
            title: '周期列表',
            cols: [
                [{
                    type: 'checkbox'
                }, {
                    field: 'id',
                    title: 'ID',
                    width: 80,
                    unresize: true,
                    hide: true
                }, {
                    field: 'name',
                    title: '周期',
                    width: 120
                }, {
                    field: 'year',
                    title: '年',
                    width: 80,
                    sort: true
                }, {
                    field: 'month',
                    title: '月',
                    width: 80,
                    sort: true
                }, {
                    field: 'start_date',
                    title: '开始日',
                    width: 160
                }, {
                    field: 'end_date',
                    title: '截止日',
                    width: 100
                }, {
                    field: 'created_at',
                    title: '创建时间',
                    width: 150,
                    sort: true
                }, {
                    field: 'updated_at',
                    title: '更新时间',
                    width: 150,
                    sort: true,
                    hide: true
                }, {
                    field: 'not_rec',
                    title: '未抄',
                    width: 80,
                    unresize: true,
                    templet: d => {
                        return `<a onclick="xadmin.open('${d.name} 未抄','/periods/${d.id}/not_rec')">查看</a>`
                    }
                }, {
                    fixed: 'right',
                    title: '操作',
                    width: 160,
                    align: 'center',
                    toolbar: '#barDemo'
                }]
            ],
            autoSort: false,
            initSort: {
                field: 'updated_at',
                type: 'desc'
            },
            page: true,
            limit: 20,
            limits: [20, 40, 80, 160, 320, 640, 1280],
            parseData: function(res) { //将原始数据解析成 table 组件所规定的数据
                total = res.data.meta.pagination.total
                return {
                    "code": 0, //解析接口状态
                    "msg": "", //解析提示文本
                    "count": total, //解析数据长度
                    "data": res.data.data //解析数据列表
                };
            }
        });
        //触发排序事件
        table.on('sort(test)', function(obj) { //注：sort 是工具条事件名，test 是 table 原始容器的属性 lay-filter="对应的值"
            table.reload('test', {
                initSort: obj //记录初始排序，如果不设的话，将无法标记表头的排序状态。
                    ,
                where: { //请求参数（注意：这里面的参数可任意定义，并非下面固定的格式）
                    search: b.criteria,
                    searchFields: b.oprt,
                    searchJoin: 'and',
                    orderBy: obj.field, //排序字段
                    sortedBy: obj.type //排序方式
                },
                page: {
                    curr: 1
                }
            });
        });

        //监听头工具栏事件
        table.on('toolbar(test)', function(obj) {
            let checkStatus = table.checkStatus(obj.config.id);
            let data = checkStatus.data; //获取选中的数据
            switch (obj.event) {
                case 'add':
                    xadmin.open('添加周期', '{{ route('periods.create') }}')
                    break;
                case 'update':
                    if (data.length === 0) {
                        layer.msg('请选择一行');
                    } else if (data.length > 1) {
                        layer.msg('只能同时编辑一个');
                    } else {
                        xadmin.open('更新周期', `/periods/${data[0].id}/edit`);
                    }
                    break;
                case 'delete':
                    if (data.length === 0) {
                        layer.msg('请选择一行');
                    } else {
                        layer.confirm('确认要删除吗？', function(index) {
                            //发异步删除数据
                            data.forEach(t => {
                                del_one(null, t.id);
                            });
                            layer.close(index);
                            table.reload('test', {});
                        });
                    }
                    break;
            };
        });

        //工具条事件
        table.on('tool(test)', function(obj) { //注：tool 是工具条事件名，test 是 table 原始容器的属性 lay-filter="对应的值"
            var data = obj.data; //获得当前行数据
            var layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）
            var tr = obj.tr; //获得当前行 tr 的 DOM 对象（如果有的话）

            if (layEvent === 'calc') { //计算
                layer.confirm('计算需耗时几分钟，是否执行？', {
                    icon: 3,
                    title: '提示'
                }, function(index) {
                    run_calc(obj.data.id);
                    layer.close(index);
                });

            } else if (layEvent === 're_calc') { //重新计算
                layer.confirm('已经计算过，再次计算会更新当前结果，且会耗时几分钟，是否继续？', {
                    icon: 3,
                    title: '提示'
                }, function(index) {
                    run_calc(obj.data.id);
                    layer.close(index);
                });
            } else if (layEvent === 'verify') { //确认
                console.log('verify');
                layer.confirm('审核后就不能再进行费用计算，是否继续？', {
                    icon: 3,
                    title: '提示'
                }, function(index) {
                    patch_period_status(obj.data.id, 2, "审核");
                    layer.close(index);
                });
            } else if (layEvent === 'unlock') { //解除锁定
                console.log('unlock');
                layer.confirm('当前周期处于计算锁定状态，是否确定手动解除锁定？', {
                    icon: 3,
                    title: '提示'
                }, function(index) {
                    patch_period_status(obj.data.id, 1, "解锁");
                    layer.close(index);
                });
            } else if (layEvent === 'not_rec') {
                xadmin.open(obj.data.name + '未抄', '/periods/' + obj.data.id + '/not_rec')
                // xadmin.add_tab(obj.data.name+'本期未抄','/periods/'+obj.data.id+'/not_rec')
            } else if (layEvent === 'un_verify') {
                un_verify(obj.data.id)
            }
        });

        let form = layui.form;
        form.on('submit(search)', function(data) {
            b = build_criteria()
            q = asm_query(b)
            table.reload('test', {
                url: '/periods',
                where: {
                    search: b.criteria,
                    searchFields: b.oprt,
                    searchJoin: 'and'
                },
                page: {
                    curr: 1 //重新从第 1 页开始
                }
            });
            return false;
        });


    });

    function del_one(obj, id) {
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        $.ajax({
            url: 'periods/' + id,
            type: 'DELETE',
            dataType: "json",
            success: function() {
                layer.msg(`已删除${id}!`, {
                    icon: 1,
                    time: 1000
                });
                if (obj) {
                    $(obj).parents("tr").remove();
                }
            },
            error: function(err) {
                layer.msg('删除失败', {
                    icon: 2,
                    time: 1000
                });
            }
        });
    }

    function run_calc(id) {
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });

        // 自定义loading层，添加旋转动画
        var loadingIndex = layer.open({
            title: "计算状态提示",
            type: 1,
            content: '<div class="custom-loading"><div class="spinner"></div><p>计算中，请稍候...</p></div>',
            shade: 0.5,
            shadeClose: false,
            closeBtn: 0,
            area: ['400px', '340px'],
            skin: 'custom-loading-layer'
        });

        $.ajax({
            url: 'periods/' + id + '/calc',
            type: 'POST',
            dataType: "json",
            success: function(d) {
                if (d.error) {
                    layer.msg('计算错误:' + d.message, {
                        icon: 2,
                        time: 15000
                    });
                } else {
                    layer.msg(`计算完成!`, {
                        icon: 1,
                        time: 1000
                    });
                }
            },
            error: function(err) {
                layer.msg('请求失败: ' + err.statusText, {
                    icon: 2,
                    time: 15000
                });
            },
            complete: function() {
                layer.close(loadingIndex);
                layui.table.reload('test', {});
            }
        });
    }

    function un_verify(id) {
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });

        $.ajax({
            url: 'periods/' + id + '/un_verify',
            type: 'POST',
            dataType: "json",
            success: function(d) {

                if (d.error) {
                    layer.msg('弃审错误:' + d.message, {
                        icon: 2,
                        time: 5000
                    });
                } else {
                    layer.msg(`弃审成功!`, {
                        icon: 1,
                        time: 1000
                    });
                    layui.table.reload('test', {});
                }

            },
            error: function(err) {
                layer.close(index);
                layer.msg('弃审错误:' + err.message, {
                    icon: 2,
                    time: 5000
                });

            }
        });
    }

    function patch_period_status(id, status, operation) {
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        $.ajax({
            url: 'periods/' + id,
            type: 'PATCH',
            dataType: "json",
            data: {
                status: status
            },
            success: function(d) {
                if (d.error) {
                    layer.msg(operation + '失败:' + d.message, {
                        icon: 2,
                        time: 5000
                    });
                } else {
                    layer.msg(operation + `成功!`, {
                        icon: 1,
                        time: 1000
                    });
                    layui.table.reload('test', {});
                }

            },
            error: function(err) {
                layer.msg(operation + '失败:' + err.message, {
                    icon: 2,
                    time: 5000
                });

            }
        });

    }

    function build_criteria() {
        let start = $("[name='start']").val();
        let end = $("[name='end']").val();
        let criteria = '';
        let oprt = '';
        if (start && end) {
            criteria += `created_at:${start},${end} 23:59:59;`;
            oprt += 'created_at:between;';
        } else {
            if (start) {
                criteria += `created_at:${start};`;
                oprt += 'created_at:>;'
            }
            if (end) {
                criteria += `created_at:${end} 23:59:59;`;
                oprt += 'created_at:<=;';
            }
        }
        if (criteria) {
            criteria = criteria.slice(0, -1);
            oprt = oprt.slice(0, -1);
        }
        return {
            criteria,
            oprt
        }
    }

    function asm_query(build_criteria, order = 'updated_at', sort = 'desc') {
        return `search=${build_criteria.criteria}&searchFields=${build_criteria.oprt}&searchJoin=and&orderBy=${order}&sortedBy=${sort}`
    }
</script>

</html>
